#ifndef __Item_h_
#define __Item_h_

#include <Ogre.h>
#include <OgreUserDefinedObject.h>

class Bullet;
class Enemy;
class MainCharacter;
class Fish;
class Bonus;
class Weapon;

class Item : public Ogre::UserDefinedObject
{

protected:
	Ogre::SceneNode* mSceneNode;
	Ogre::Entity* mEntity;
	Ogre::SceneManager* mSceneMgr;
	std::string mName;

protected:
	Item(Ogre::SceneManager* _mSceneMgr) : mSceneNode(0), mEntity(0), mSceneMgr(_mSceneMgr) {}
	Item(const std::string& name) : mSceneNode(0), mEntity(0), mSceneMgr(0), mName(name) {}
	virtual void initialize() = 0;

	virtual void setSceneNode(Ogre::SceneNode* sceneNode) { mSceneNode=sceneNode; }
	virtual void setEntity(Ogre::Entity* entity) { mEntity=entity; }
	virtual void setSceneManager(Ogre::SceneManager* sceneMgr) { mSceneMgr=sceneMgr; }
	virtual void setName(const std::string& name) { mName=name; }

public:
	virtual void collision(Item* _item) = 0;
	virtual void collisionWithBullet(Bullet* _bullet) = 0;
	virtual void collisionWithEnemy(Enemy* _enemy) = 0;
	virtual void collisionWithMainCharacter(MainCharacter* _mainCharacter) = 0;
	virtual void collisionWithFish(Fish * _fish) = 0;
	virtual void collisionWithBonus(Bonus* _bonus) = 0;
	virtual void collisionWithWeapon(Weapon* weapon) = 0;

	virtual Ogre::SceneNode* getSceneNode() { return mSceneNode; }
	virtual Ogre::Entity* getEntity() { return mEntity; }
	virtual Ogre::SceneManager* getSceneManager() { return mSceneMgr; }
	virtual const std::string& getName() const { return mName; }

};

#endif